package com.onluy.frameworkcloud.tools.utils;

import java.io.IOException;

import org.apache.commons.codec.binary.Base64;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * 使用 commons-codec 进行 BASE64编解码
 * 计算机中任何数据都是按ascii码存储的，而ascii码的128～255之间的值是不可见字符。
 * 而在网络上交换数据时，往往要经过多个路由设备，由于不同的设备对字符的处理方式有一些不同，这样那些不可见字符就有可能被处理错误，
 * 所以就先把数据先做一个Base64编码，统统变成可见字符，这样出错的可能性就大降低了
 * @author xmh
 *
 */
public class Base64Utils {

	/**
     * 使用Base64加密算法加密字符串
     * @param plainText
     * @return
     */
//    public static String encodeStr(String plainText){
//        byte[] b=plainText.getBytes();
//        Base64 base64=new Base64();
//        b=base64.encode(b);
//        String s=new String(b);
//        return s;
//    }
    
	/**
     * 使用Base64加密算法加密byte[]
     * @param plainText
     * @return
     */
//    public static String encodeStr(byte[] plain){
//        Base64 base64=new Base64();
//        byte[] target = base64.encode(plain);
//        String s=new String(target);
//        return s;
//    } 
    
    
    /**
     * 使用Base64解码
     * @param encodeStr
     * @return
     */
//    public static byte[] decode(String encodeStr){
////        byte[] b = encodeStr.getBytes();
////        Base64 base64=new Base64();
////        b=base64.decode(b);
////        String s=new String(b);
////        return s;
//    	
////    	byte[] b = encodeStr.getBytes(Charsets.UTF_8);
////    	return decode(b);
//    }
    
    /** 
     * 解密
     * @param bytes 
     * @return 
     */  
    public static byte[] decode(final byte[] bytes) {  
        return Base64.decodeBase64(bytes);  
    }  
  
    /** 
     * 二进制数据编码为BASE64字符串 
     * 加密
     * @param bytes 
     * @return 
     * @throws Exception 
     */  
    public static String encode(final byte[] bytes) {  
        return new String(Base64.encodeBase64(bytes));  
    } 
    
    
    /**  
     * 编码 2 
     * @param bstr  
     * @return String  
     */    
    public static String encode2(byte[] bytes){    
    return new BASE64Encoder().encode(bytes);    
    } 
    
    /** 
     * 解密2
     * @param bytes 
     * @return 
     */  
    public static byte[] decode2(String str) {  
    	BASE64Decoder decoder = new BASE64Decoder(); 
    	// Base64解码  
        byte[] bytes = null;
		try {
			bytes = decoder.decodeBuffer(str);
		} catch (IOException e) {
			e.printStackTrace();
		}  
//        for (int i = 0; i < bytes.length; ++i) {  
//            if (bytes[i] < 0) {// 调整异常数据  
//                bytes[i] += 256;  
//            }  
//        }  
        return bytes;  
    }  
    
    public static void main(String[] args) {
		//System.out.println(encodeStr("ximinhui"));
		//System.out.println(decodeStr(encodeStr("ximinhui")));
		
/*		byte[] plain = "ximinhui".getBytes();
		System.out.println(plain);
        Base64 base64=new Base64();
        byte[] target = base64.encode(plain);
        System.out.println(target);
        String s=new String(target);
        System.out.println(s);
        
        System.out.println(decodeStr(s));*/
    	
    	String plain = "oRssR3iFHV7wWtevSHyqXl4Bo9Gs8klO";
    	System.out.println(plain.getBytes().length);
    	
    	String target = encode(plain.getBytes());
    	System.out.println(target.getBytes().length);
        
    	byte[] news = decode(target.getBytes());
    	System.out.println(new String(news));
	}
}
